#include <iostream>
using namespace std;
#include <signal.h>
#include <cstring>
#include <unistd.h>

// 自定义递达处理函数
void handler(int signo)
{
    cout << "get a signal..." << "signo:" << signo << endl;
    exit(0);
}

void printPending(sigset_t &pending)
{
    for (int i = 1; i <= 40; i++)
    {
        if (sigismember(&pending, i))
        {
            cout << "1";
        }
        else
        {
            cout << "0";
        }
    }
    cout << endl;
}

int main()
{
    signal(2, handler);
    // 创建新老信号集,并清空
    sigset_t act, oact;
    sigemptyset(&act);
    sigemptyset(&oact);
    // 阻塞2号信号，和40号信号
    sigaddset(&act, 2);
    sigaddset(&act, 40);
    // 以上只是栈中，并没有设置进内核
    sigprocmask(SIG_SETMASK, &act, &oact);

    sigset_t pending;
    sigemptyset(&pending);
    // 自己给自己进程发送5次二号信号和5次40号信号
    int cnt = 10;
    while (cnt)
    {
        // raise函数可以自己给自己进程发送信号
        raise(2);
        raise(40);
        // pending获取，打印观察现象
        sigpending(&pending);
        printPending(pending);
        if (cnt == 5)
        {
            // 5秒之后，解除2号信号  40号不解除
            // sigprocmask(SIG_SETMASK, &oact, nullptr);
            sigdelset(&act, 2);
            sigprocmask(SIG_SETMASK, &act, &oact);
        }
        cnt--;
        sleep(1);
    }

    return 0;
}

// int main()
// {
//     //创建新的act设置进去，老的oact带出原来的
//     struct sigaction act, oact;
//     //创建完清空
//     memset(&act, 0, sizeof act);
//     memset(&oact, 0, sizeof oact);
//     act.sa_flags = 0;
//     oact.sa_flags = 0;
//     //对信号集字段都清空
//     sigemptyset(&act.sa_mask);
//     sigemptyset(&oact.sa_mask);
//     //自定义
//     act.sa_handler = handler;
//     sigaction(2, &act, &oact);
//     while(true)
//     {
//         sleep(1);
//         cout<<"I am running ..."<<endl;
//     }
//     return 0;
// }